home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / lib / rcscripts / net.modules.d / ifconfig < prev    next >
Text File  |  2006-04-25  |  9KB  |  334 lines

  1. # Copyright (c) 2004-2005 Gentoo Foundation
  2. # Distributed under the terms of the GNU General Public License v2
  3. # $Header$
  4.  
  5. # Contributed by Roy Marples (uberlord@gentoo.org)
  6.  
  7. # Fix any potential localisation problems
  8. # Note that LC_ALL trumps LC_anything_else according to locale(7)
  9. ifconfig() {
  10.     LC_ALL=C /sbin/ifconfig "$@"
  11. }
  12.  
  13. ifconfig_tunnel() {
  14.     LC_ALL=C /sbin/iptunnel "$@"
  15. }
  16.  
  17. # void ifconfig_depend(void)
  18. #
  19. # Sets up the dependancies for the module
  20. ifconfig_depend() {
  21.     after macchanger wireless
  22. }
  23.  
  24. # bool ifconfig_check_installed(void)
  25. #
  26. # Returns 1 if ifconfig is installed, otherwise 0
  27. ifconfig_check_installed() {
  28.     [[ -x /sbin/ifconfig ]] && return 0
  29.     ${1:-false} && eerror "For ifconfig support, emerge sys-apps/net-tools"
  30.     return 1
  31. }
  32.  
  33. # char* ifconfig_provides(void)
  34. #
  35. # Returns a string to change module definition for starting up
  36. ifconfig_provides() {
  37.     echo "interface"
  38. }
  39.  
  40. # char* ifconfig_module(void)
  41. #
  42. # Returns the module name
  43. # This is needed by dhclient as we run different scripts
  44. # based on the interface
  45. ifconfig_module() {
  46.     echo "ifconfig"
  47. }
  48.  
  49. # bool ifconfig_check_depends(void)
  50. #
  51. # Checks to see if we have the needed functions
  52. ifconfig_check_depends() {
  53.     local f
  54.  
  55.     for f in interface_variable; do
  56.         [[ $( type -t ${f} ) == function ]] && continue
  57.         eerror "ifconfig: missing required function ${f}\n"
  58.         return 1
  59.     done
  60.  
  61.     return 0
  62. }
  63.  
  64. # bool ifconfig_exists(char *interface, bool report)
  65. #
  66. # Returns 1 if the interface exists, otherwise 0
  67. ifconfig_exists() {
  68.     local e=$( ifconfig -a | grep -o "^${1}" ) report=${2:-false}
  69.     [[ -n ${e} ]] && return 0
  70.     ${report} && eerror "${1} does not exist"
  71.     return 1
  72. }
  73.  
  74. # void ifconfig_up(char *iface)
  75. #
  76. # provides a generic interface for bringing interfaces up
  77. ifconfig_up() {
  78.     ifconfig ${1} up &>${devnull}
  79. }
  80.  
  81. # void ifconfig_down(char *iface)
  82. #
  83. # provides a generic interface for bringing interfaces down
  84. ifconfig_down() {
  85.     ifconfig ${1} down &>${devnull}
  86. }
  87.  
  88. # bool ifconfig_is_up(char *iface, bool withaddress)
  89. #
  90. # Returns 0 if the interface is up, otherwise 1
  91. # If withaddress is true then the interface has to have an IPv4 address
  92. # assigned as well
  93. ifconfig_is_up() {
  94.     local check="\<UP\>" addr=${2:-false}
  95.     ${addr} && check="\<addr:.*${check}"
  96.     ifconfig ${1} 2>${devnull} | grep -v Scope | xargs | grep -Eq "${check}" && return 0
  97.     return 1
  98. }
  99.  
  100. # void ifconfig_set_flag(char *iface, char *flag, bool enabled)
  101. #
  102. # Sets or disables the interface flag 
  103. ifconfig_set_flag() {
  104.     local iface=${1} flag=${2} enable=${3}
  105.     ${enable} || flag="-${flag}"
  106.     ifconfig ${iface} ${flag} &>${devnull}
  107. }
  108.  
  109. # void ifconfig_loopback_create(void)
  110. #
  111. # Creates our loopback interface
  112. ifconfig_loopback_create() {
  113.     ifconfig lo 127.0.0.1 up 2>/dev/null
  114.     /sbin/route add -net 127.0.0.0 netmask 255.0.0.0 \
  115.         gw 127.0.0.1 dev lo 2> /dev/null
  116. }
  117.  
  118. # void ifconfig_get_address(char *interface)
  119. #
  120. # Fetch the address retrieved by DHCP.  If successful, echoes the
  121. # address on stdout, otherwise echoes nothing.
  122. ifconfig_get_address() {
  123.     ifconfig ${1} | grep -m1 -o 'inet addr:[^ ]*' | cut -d: -f2
  124. }
  125.  
  126. # void ifconfig_get_mac_address(char *interface)
  127. #
  128. # Fetch the mac address assingned to the network card
  129. ifconfig_get_mac_address() {
  130.     ifconfig ${1} | grep -m1 -o 'HWaddr [^ ]*' | cut -d" " -f2
  131. }
  132.  
  133. # void ifconfig_get_aliases_rev(char *interface)
  134. #
  135. # Fetch the list of aliases for an interface.  
  136. # Outputs a space-separated list on stdout, in reverse order, for
  137. # example "eth0:2 eth0:1"
  138. ifconfig_get_aliases_rev() {
  139.     ifconfig | grep -o "^${1}:[0-9]*" | tac | xargs
  140. }
  141.  
  142. # bool ifconfig_interface_del_addresses(char *interface)
  143. #
  144. # Remove addresses from interface.  Returns 0 (true) if there
  145. # were addresses to remove (whether successful or not).  Returns 1
  146. # (false) if there were no addresses to remove.
  147. ifconfig_del_addresses() {
  148.     local iface=${1} i
  149.  
  150.     # We don't remove addresses from aliases
  151.     [[ ${iface} == *:* ]] && return 0
  152.  
  153.     # If the interface doesn't exist, don't try and delete
  154.     ifconfig_exists ${iface} || return 0
  155.  
  156.     # iproute2 can add many addresses to an iface unlike ifconfig ...
  157.     # iproute2 added addresses cause problems for ifconfig
  158.     # as we delete an address, a new one appears, so we have to
  159.     # keep polling
  160.     while ifconfig ${iface} | grep -q -m1 -o 'inet addr:[^ ]*' ; do
  161.         ifconfig ${iface} 0.0.0.0 || break
  162.     done
  163.     
  164.     # Remove IPv6 addresses
  165.     for i in "$(ifconfig ${iface} | awk '$1=="inet6" && $4!="Scope:Link" {print $3}')"; do
  166.         /sbin/ifconfig ${interface} inet6 del ${i} &>/dev/null
  167.     done
  168.  
  169.     return 0
  170. }
  171.  
  172. # char* ifconfig_get_vars(char *interface)
  173. #
  174. # Returns a string spaced with possible user set
  175. # configuration variables
  176. ifconfig_get_vars() {
  177.         echo "config_${1} routes_${1} fallback_${1}  ifconfig_${1} ifconfig_fallback_${1} routes_${1} inet6_${1} iface_${1} alias_${1} broadcast_${1} netmask_${1}"
  178.     # The depreciated gateway var has to be handled by
  179.     # each module if needed
  180. }
  181.  
  182. # bool ifconfig_get_old_config(char *iface)
  183. #
  184. # Returns config and config_fallback for the given interface
  185. ifconfig_get_old_config() {
  186.     local iface=${1} ifvar=$( interface_variable ${1} ) i inet6
  187.  
  188.     eval config=( \"\$\{ifconfig_${ifvar}\[@\]\}\" )
  189.     eval config_fallback=( \"\$\{ifconfig_fallback_${ifvar}\[@\]\}\" )
  190.     eval inet6=( \"\$\{inet6_${ifvar}\[@\]\}\" )
  191.  
  192.     # BACKWARD COMPATIBILITY: populate the config_IFACE array
  193.     # if iface_IFACE is set (fex. iface_eth0 instead of ifconfig_eth0)
  194.     eval local i=\"\$\{iface_${ifvar}\}\"
  195.     if [[ -n ${i} && -z ${config} ]]; then
  196.         # Make sure these get evaluated as arrays
  197.         local -a aliases broadcasts netmasks
  198.  
  199.         # Start with the primary interface
  200.         config=( "${i}" )
  201.  
  202.         # ..then add aliases
  203.         eval aliases=( \$\{alias_${ifvar}\} )
  204.         eval broadcasts=( \$\{broadcast_${ifvar}\} )
  205.         eval netmasks=( \$\{netmask_${ifvar}\} )
  206.         for (( i=0; i<${#aliases[@]}; i++ )); do
  207.             config[i+1]="${aliases[i]} ${broadcasts[i]:+broadcast ${broadcasts[i]}} ${netmasks[i]:+netmask ${netmasks[i]}}"
  208.         done
  209.     fi
  210.  
  211.     # BACKWARD COMPATIBILITY: check for space-separated inet6 addresses
  212.     [[ ${#inet6[@]} == 1 && ${inet6} == *' '* ]] &&  inet6=( ${inet6} )
  213.  
  214.     # Add inet6 addresses to our config if required
  215.     [[ -n ${inet6} ]] && config=( "${config[@]}" "${inet6[@]}" )
  216.  
  217.     return 0
  218. }
  219.  
  220. # bool ifconfig_iface_stop(char *interface)
  221. #
  222. # Do final shutdown for an interface or alias.
  223. #
  224. # Returns 0 (true) when successful, non-zero (false) on failure
  225. ifconfig_iface_stop() {
  226.     # If an alias is already down, then "ifconfig eth0:1 down"
  227.     # will try to bring it up with an address of "down" which
  228.     # fails.  Do some double-checking before returning error
  229.     # status
  230.     ifconfig_is_up $1 || return 0
  231.     ifconfig_down ${1} && return 0
  232.  
  233.     # It is sometimes impossible to transition an alias from the
  234.     # UP state... particularly if the alias has no address.  So
  235.     # ignore the failure, which should be okay since the entire
  236.     # interface will be shut down eventually.
  237.     [[ ${1} == *:* ]] && return 0
  238.     return 1
  239. }
  240.  
  241. # bool ifconfig_post_start(char *iface)
  242. #
  243. # Bring up iface using ifconfig utilities, called from iface_start
  244. #
  245. # Returns 0 (true) when successful on the primary interface, non-zero
  246. # (false) when the primary interface fails.  Aliases are allowed to
  247. # fail, the routine should still return success to indicate that
  248. # net.eth0 was successful
  249. ifconfig_post_start() {
  250.     local iface=${1} ifvar=$( interface_variable ${1} ) routes x
  251.  
  252.     # Make sure interface is marked UP
  253.     ifconfig_up ${iface}
  254.  
  255.     eval routes=( \"\$\{routes_${ifvar}\[@\]\}\" )
  256.  
  257.     # BACKWARD COMPATIBILITY: set the default gateway
  258.     if [[ ${gateway} == ${iface}/* ]]; then
  259.         # We don't add the old gateway if one has been set in routes_IFACE
  260.         local gw=true
  261.         for x in "${routes[@]}"; do
  262.             [[ ${x} != "*default gw*" ]] && continue
  263.             gw=false
  264.             break
  265.         done
  266.         ${gw} && routes=( "${routes[@]}" "default gw ${gateway#*/}" )
  267.     fi
  268.  
  269.     [[ -z ${routes} ]] && return 0
  270.  
  271.     # Add routes for this interface, might even include default gw
  272.     einfo "Adding routes"
  273.     eindent
  274.     for x in "${routes[@]}"; do
  275.         # Support iproute2 style routes
  276.         x=${x//via/gw}
  277.         
  278.         ebegin "${x}"
  279.         # Support adding IPv6 addresses easily
  280.         if [[ ${x} == *:* && ${x} != *'-A inet6'* ]]; then
  281.             /sbin/route add -A inet6 ${x} &>${devnull}
  282.         else
  283.             /sbin/route add ${x} &>${devnull}
  284.         fi
  285.         eend $?
  286.     done
  287.     eoutdent
  288.     
  289.     return 0
  290. }
  291.  
  292. # bool ifconfig_add_address(char *iface, char *options ...)
  293. #
  294. # Adds the given address to the interface
  295. ifconfig_add_address() {
  296.     local iface=${1} i=0
  297.  
  298.     ifconfig_exists ${iface} true || return 1
  299.  
  300.     # Extract the config
  301.     local -a config=( "$@" )
  302.     config=( ${config[@]:1} )
  303.  
  304.     if [[ ${config[0]} == *:* ]]; then
  305.         # Support IPv6 - nice and simple
  306.         config[0]="inet6 add ${config[0]}"
  307.     else
  308.         # IPv4 is tricky - ifconfig requires an aliased device
  309.         # for multiple addresses
  310.         if ifconfig ${iface} | grep -v Scope | xargs | grep -Eq "\<addr:.*" ; then
  311.             # Get the last alias made for the interface and add 1 to it
  312.             i=$( ifconfig | tac | grep -m 1 -o "^${iface}:[0-9]*" | awk -F: '{ print $2 }' )
  313.             i=${i:-0}
  314.             (( i++ ))
  315.             iface=${iface}:${i}
  316.         fi
  317.  
  318.         # Support iproute2 style config where possible
  319.         config=( "${config[@]//brd/broadcast}" )
  320.         config=( "${config[@]//peer/pointtopoint}" )
  321.  
  322.         # ifconfig doesn't work with CIDR addresses
  323.         local cidr="${config[0]##*/}" ip="${config[0]%%/*}"
  324.         if [[ -n ${cidr} && ${cidr} != ${ip} ]]; then
  325.             local netmask=$( cidr2netmask "${cidr}" )
  326.             config[0]="${ip} netmask ${netmask}"
  327.         fi
  328.     fi
  329.  
  330.     ifconfig ${iface} ${config[@]} &>${devnull}
  331.     eend $?
  332.     return $?
  333. }
  334.